#!/usr/bin/env node

/**
 * Draw.io MCP 服务器
 * 
 * 这是一个Model Context Protocol (MCP) 服务器，专门用于指导大语言模型生成
 * 符合项目规范的Draw.io图表。该服务器不直接生成图表文件，而是提供详细的
 * 转换指导和规范要求，让大语言模型根据指导生成正确的Draw.io XML内容。
 * 
 * 主要功能：
 * 1. 时序图生成指导 - 基于Mermaid语法转换为Draw.io格式
 * 2. 流程图生成指导 - 提供标准化的流程图绘制规范
 * 3. 版本管理 - 自动处理文件版本控制和变更追踪
 * 4. 样式规范 - 确保生成的图表符合项目统一样式
 * 5. 智能助手 - 帮助用户选择合适的工具和流程
 * 
 * @author MCP Team
 * @version 2.0
 * @since 2025-01-31
 */

import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import {
  CallToolRequestSchema,
  ListToolsRequestSchema,
  Tool,
} from '@modelcontextprotocol/sdk/types.js';
import { DiagramRulesManager } from './diagram-rules.js';
import { FileManager } from './file-manager.js';
import { FlowchartGuide } from './flowchart-guide.js';
import { SequenceGuide } from './sequence-guide.js';

/**
 * Draw.io MCP 服务器主类
 * 
 * 负责管理所有MCP工具的注册和调用，协调各个组件之间的交互。
 * 该类实现了MCP协议的标准接口，提供图表生成指导服务。
 */
class DrawioMCPServer {
  private server: Server;                          // MCP服务器实例
  private rulesManager: DiagramRulesManager;      // 图表规则管理器
  private fileManager: FileManager;               // 文件管理器
  private flowchartGuide: FlowchartGuide;         // 流程图指导器
  private sequenceGuide: SequenceGuide;           // 时序图指导器

  constructor() {
    this.server = new Server(
      {
        name: 'drawio-rules',
        version: '1.0.0',
      },
      {
        capabilities: {
          tools: {},
        },
      }
    );

    this.rulesManager = new DiagramRulesManager();
    this.fileManager = new FileManager();
    this.flowchartGuide = new FlowchartGuide();
    this.sequenceGuide = new SequenceGuide();

    this.setupToolHandlers();
  }

  private async smartDiagramAssistant(userRequest: string, context?: string): Promise<any> {
    try {
      const request = userRequest.toLowerCase();
      const contextInfo = context ? context.toLowerCase() : '';
      
      // 分析用户请求，推荐工具调用顺序
      let recommendations: string[] = [];
      let diagramType = '';
      let priority = '';
      
      // 检测图表类型
      if (request.includes('时序图') || request.includes('sequence') || request.includes('交互流程') || request.includes('消息流')) {
        diagramType = 'sequence';
        priority = '🔥 高优先级';
      } else if (request.includes('流程图') || request.includes('flowchart') || request.includes('业务流程') || request.includes('api') || request.includes('接口')) {
        diagramType = 'flowchart';
        priority = '🔥 高优先级';
      } else if (request.includes('架构图') || request.includes('architecture') || request.includes('系统架构') || request.includes('技术架构')) {
        diagramType = 'architecture';
        priority = '🔥 高优先级';
      } else if (request.includes('类图') || request.includes('class') || request.includes('类设计')) {
        diagramType = 'class';
        priority = '📋 中优先级';
      } else if (request.includes('组件图') || request.includes('component') || request.includes('组件设计')) {
        diagramType = 'component';
        priority = '📋 中优先级';
      }
      
      // 生成推荐步骤
      recommendations.push('🧠 **第一步：理解确认**');
      recommendations.push('   在开始绘图前，请先理解项目背景、业务场景和关键需求');
      recommendations.push('🚀 **第二步：加载绘图规范**');
      recommendations.push('   调用 `load_drawio_rules` 工具加载最新的v2.0绘图规范');
      
      if (diagramType) {
        recommendations.push(`🎨 **第三步：获取${diagramType === 'sequence' ? '时序图' : diagramType === 'flowchart' ? '流程图' : diagramType === 'architecture' ? '架构图' : diagramType === 'class' ? '类图' : '组件图'}专用指导**`);
        recommendations.push(`   调用 \`get_diagram_guidelines\` 工具，参数：diagram_type="${diagramType}"`);
      }
      
      // API相关的特殊处理
      if (request.includes('api') || request.includes('接口') || contextInfo.includes('api')) {
        recommendations.push('🔧 **第四步：生成API流程图指导**');
        recommendations.push('   调用 `generate_api_flow_diagram` 工具，提供API路径');
      }
      
      // Mermaid转换相关
      if (request.includes('mermaid') || request.includes('转换') || request.includes('生成draw.io')) {
        recommendations.push('⚡ **关键步骤：Mermaid转换**');
        recommendations.push('   使用 `convert_mermaid_to_drawio_llm` 工具进行智能转换');
        recommendations.push('   ⚠️ 确保包含自环消息和半透明分组框的正确实现');
      } else {
        recommendations.push('📝 **建议流程：**');
        recommendations.push('   1. 先让AI生成Mermaid语法');
        recommendations.push('   2. 再使用 `convert_mermaid_to_drawio_llm` 转换为Draw.io');
      }
      
      // 文件命名建议
      recommendations.push('📁 **文件管理：**');
      recommendations.push('   使用 `get_file_naming_suggestion` 获取标准文件名');
      
      return {
        content: [
          {
            type: 'text',
            text: `# 🤖 智能图表助手分析结果\n\n## 📊 需求分析\n**用户请求**: ${userRequest}\n**检测到的图表类型**: ${diagramType || '未明确指定'}\n**优先级**: ${priority || '📋 标准优先级'}\n\n## 🛠️ 推荐工具调用顺序\n\n${recommendations.join('\n')}\n\n## 💡 关键提示\n\n### 基于0823版本的优秀实践\n- ✅ 自环消息使用 \`<Array as="points">\` 定义弯曲路径\n- ✅ 分组框使用 \`opacity=30\` 半透明背景\n- ✅ 参与者使用标准蓝色配色 (#dae8fc + #6c8ebf)\n- ✅ 生命线使用黑色虚线 (dashed=1)\n\n### 🚨 动态尺寸优化 (防止时间线不够)\n- ⚠️ **智能尺寸计算**：MCP会根据流程复杂度自动计算合适的页面尺寸\n- ⚠️ **生命线长度**：确保生命线长度足够覆盖所有消息\n- ⚠️ **页面边距**：为复杂流程预留足够的缓冲空间\n- ⚠️ **布局检查**：最终验证所有元素都在页面范围内\n\n### 工具调用建议\n1. **🧠 首先进行理解确认** - 确保充分理解项目背景和需求\n2. **🚀 加载绘图规范** - 调用 \`load_drawio_rules\` 加载规范\n3. **🎨 获取专业指导** - 根据图表类型调用相应的指导工具\n4. **⚡ 执行转换** - 使用 \`convert_mermaid_to_drawio_llm\` 进行转换\n\n### ⚠️ 重要提醒\n**理解确认是关键步骤**：每个MCP工具都会要求大模型先进行理解确认，以防止遗漏关键信息和步骤。\n\n## 🎯 下一步行动\n请按照上述推荐顺序调用相应的MCP工具，并确保在每个步骤都完成理解确认！`
          }
        ]
      };
    } catch (error) {
      return {
        content: [
          {
            type: 'text',
            text: `智能助手分析失败: ${error instanceof Error ? error.message : String(error)}`
          }
        ]
      };
    }
  }

  private async regenerateDiagramWithVersion(mermaidSyntax: string, diagramType: string, moduleName: string, changeDescription: string, previousVersion?: string): Promise<any> {
    try {
      // 使用带有变更描述的转换，这会自动处理版本递增
      const result = await this.sequenceGuide.convertMermaidToDrawioLLM(mermaidSyntax, diagramType, moduleName, changeDescription);
      
      // 在结果中添加版本管理信息
      if (result.content && result.content[0] && result.content[0].text) {
        const originalText = result.content[0].text;
        const versionManagementInfo = `
## 🔄 重新生成说明

**这是一个版本更新的重新生成操作**

### 版本管理策略
- ✅ **自动版本递增**：避免覆盖原文件
- ✅ **变更追踪**：记录修改原因和内容
- ✅ **历史保留**：保持所有版本的完整记录

### 变更信息
**变更描述**: ${changeDescription}
${previousVersion ? `**基于版本**: ${previousVersion}` : ''}
**变更类型**: 内容补充和完善

### 📋 重要提醒
1. **原文件保留**：之前的版本文件不会被删除
2. **版本对比**：可以对比不同版本查看改进
3. **CHANGELOG更新**：变更记录会自动添加到日志中

---
`;
        
        result.content[0].text = originalText.replace('## 🎯 MCP指导原则', versionManagementInfo + '## 🎯 MCP指导原则');
      }
      
      return result;
    } catch (error) {
      return {
        content: [
          {
            type: 'text',
            text: `重新生成失败: ${error instanceof Error ? error.message : String(error)}`
          }
        ]
      };
    }
  }

  private setupToolHandlers() {
    this.server.setRequestHandler(ListToolsRequestSchema, async () => {
      return {
        tools: [
          {
            name: 'load_drawio_rules',
            description: '⚠️ 必须首先调用！当用户要求生成任何图表时，必须先加载绘图规则和规范。基于0823版本的优秀实践，提供最新的v2.0规范。触发词：生成图表、绘制图表、画图、创建图表、设计图表、draw.io、流程图、架构图、时序图、类图、组件图、系统设计、业务流程、API文档、技术架构',
            inputSchema: {
              type: 'object',
              properties: {
                rule_type: {
                  type: 'string',
                  enum: ['all', 'naming', 'styling', 'versioning'],
                  default: 'all',
                  description: '规则类型：all（所有规则）、naming（命名规范）、styling（样式规范）、versioning（版本管理）'
                }
              },
              required: []
            }
          },
          {
            name: 'get_diagram_guidelines',
            description: '🎨 获取特定类型图表的详细绘制指导。在加载规则后使用，为具体的图表类型提供专业指导。触发词：如何绘制、绘制指导、图表规范、样式指导、API文档、接口设计、业务流程、系统架构、类设计、组件设计、技术架构',
            inputSchema: {
              type: 'object',
              properties: {
                diagram_type: {
                  type: 'string',
                  enum: ['flowchart', 'architecture', 'sequence', 'class', 'component'],
                  description: '图表类型：flowchart（流程图/API调用流程）、architecture（架构图）、sequence（时序图）、class（类图）、component（组件图）'
                },
                context: {
                  type: 'string',
                  description: '具体场景，如API路径、业务流程描述等'
                }
              },
              required: ['diagram_type']
            }
          },
          {
            name: 'generate_api_flow_diagram',
            description: '🚀 专业API流程图生成器！当用户提到API路径、接口调用、服务调用时优先使用。自动解析API路径并生成标准流程结构。触发词：API流程、接口调用、服务调用、API路径、接口设计、服务架构、微服务、RESTful API、后端服务、API文档',
            inputSchema: {
              type: 'object',
              properties: {
                api_path: {
                  type: 'string',
                  description: 'API路径，如 /apiintegration/spic/pipeline/run'
                },
                description: {
                  type: 'string',
                  description: 'API功能描述或调用场景'
                },
                module_name: {
                  type: 'string',
                  description: '模块名称，从API路径自动提取或用户指定'
                }
              },
              required: ['api_path']
            }
          },
          {
            name: 'validate_diagram_specs',
            description: '验证图表描述是否符合规范要求',
            inputSchema: {
              type: 'object',
              properties: {
                diagram_description: {
                  type: 'string',
                  description: '图表描述内容'
                },
                filename: {
                  type: 'string',
                  description: '文件名（用于验证命名规范）'
                }
              },
              required: ['diagram_description']
            }
          },
          {
            name: 'get_file_naming_suggestion',
            description: '根据模块和图表类型建议标准文件名',
            inputSchema: {
              type: 'object',
              properties: {
                module_name: {
                  type: 'string',
                  description: '模块名称'
                },
                diagram_type: {
                  type: 'string',
                  description: '图表类型'
                },
                version: {
                  type: 'string',
                  default: 'v1.0',
                  description: '版本号（可选，默认 v1.0）'
                }
              },
              required: ['module_name', 'diagram_type']
            }
          },
          {
            name: 'create_versioned_file',
            description: '创建版本化的Draw.io文件，自动处理版本管理',
            inputSchema: {
              type: 'object',
              properties: {
                module_name: {
                  type: 'string',
                  description: '模块名称'
                },
                diagram_type: {
                  type: 'string',
                  description: '图表类型（flowchart、architecture、sequence、class、component）'
                },
                change_description: {
                  type: 'string',
                  description: '变更描述，用于自动推荐版本号递增类型'
                }
              },
              required: ['module_name', 'diagram_type']
            }
          },
          {
            name: 'suggest_version_increment',
            description: '根据变更描述建议版本号递增',
            inputSchema: {
              type: 'object',
              properties: {
                module_name: {
                  type: 'string',
                  description: '模块名称'
                },
                diagram_type: {
                  type: 'string',
                  description: '图表类型'
                },
                change_description: {
                  type: 'string',
                  description: '变更描述'
                }
              },
              required: ['module_name', 'diagram_type', 'change_description']
            }
          },
          {
            name: 'convert_mermaid_to_drawio',
            description: '分析Mermaid图表语法并提供Draw.io转换指导。MCP不直接生成Draw.io文件，而是提供详细的转换规范和指导，让大模型根据指导生成符合项目规范的draw.io XML内容。',
            inputSchema: {
              type: 'object',
              properties: {
                mermaid_syntax: {
                  type: 'string',
                  description: 'AI生成的Mermaid图表语法'
                },
                diagram_type: {
                  type: 'string',
                  enum: ['flowchart', 'architecture', 'sequence', 'class', 'component'],
                  description: '图表类型：flowchart（流程图）、architecture（架构图）、sequence（时序图）、class（类图）、component（组件图）'
                },
                module_name: {
                  type: 'string',
                  description: '模块名称，用于文件命名'
                },
                description: {
                  type: 'string',
                  description: '图表的描述信息（用于文档记录）'
                }
              },
              required: ['mermaid_syntax', 'diagram_type', 'module_name']
            }
          },
          {
            name: 'convert_mermaid_to_drawio_llm',
            description: '✨ 最重要的转换工具！智能分析Mermaid语法并提供基于0823版本的详细Draw.io转换指导。包含自环消息、半透明分组框等关键特性。当用户已有Mermaid语法时必须使用。触发词：转换为draw.io、Mermaid转换、生成draw.io文件、时序图转换、流程图转换、生成XML、保存图表',
            inputSchema: {
              type: 'object',
              properties: {
                mermaid_syntax: {
                  type: 'string',
                  description: 'AI生成的Mermaid图表语法'
                },
                diagram_type: {
                  type: 'string',
                  enum: ['flowchart', 'architecture', 'sequence', 'class', 'component'],
                  description: '图表类型：flowchart（流程图）、architecture（架构图）、sequence（时序图）、class（类图）、component（组件图）'
                },
                module_name: {
                  type: 'string',
                  description: '模块名称，用于文件命名'
                },
                description: {
                  type: 'string',
                  description: '图表的描述信息（用于文档记录）'
                }
              },
              required: ['mermaid_syntax', 'diagram_type', 'module_name']
            }
          },
          {
            name: 'smart_diagram_assistant',
            description: '🤖 智能图表助手！当用户询问如何绘制图表、需要什么工具、或者不确定从哪里开始时，自动分析用户需求并推荐最合适的工具调用顺序。这是一个智能入口工具，帮助用户快速找到正确的绘图路径。触发词：如何绘制、怎么画图、需要什么工具、从哪里开始、图表帮助、绘图帮助、不知道怎么做',
            inputSchema: {
              type: 'object',
              properties: {
                user_request: {
                  type: 'string',
                  description: '用户的原始请求或问题描述'
                },
                context: {
                  type: 'string',
                  description: '额外的上下文信息（可选）'
                }
              },
              required: ['user_request']
            }
          },
          {
            name: 'regenerate_diagram_with_version',
            description: '🔄 智能重新生成工具！当用户觉得现有图表不完整需要补充信息重新生成时，自动递增版本号避免覆盖原文件。支持版本管理和变更追踪。触发词：重新生成、补充信息、不完整、需要修改、版本更新、改进图表',
            inputSchema: {
              type: 'object',
              properties: {
                mermaid_syntax: {
                  type: 'string',
                  description: '更新后的Mermaid图表语法'
                },
                diagram_type: {
                  type: 'string',
                  enum: ['flowchart', 'architecture', 'sequence', 'class', 'component'],
                  description: '图表类型'
                },
                module_name: {
                  type: 'string',
                  description: '模块名称'
                },
                change_description: {
                  type: 'string',
                  description: '变更描述：说明这次重新生成的原因和改进内容'
                },
                previous_version: {
                  type: 'string',
                  description: '上一个版本号（可选，用于版本追踪）'
                }
              },
              required: ['mermaid_syntax', 'diagram_type', 'module_name', 'change_description']
            }
          },
          {
            name: 'cleanup_temp_files',
            description: '清理所有临时文件，释放存储空间。建议定期执行此操作。',
            inputSchema: {
              type: 'object',
              properties: {
                random_string: {
                  type: 'string',
                  description: 'Dummy parameter for no-parameter tools'
                }
              },
              required: ['random_string']
            }
          }
        ] as Tool[]
      };
    });

    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
      const { name, arguments: args } = request.params;

      try {
        switch (name) {
          case 'load_drawio_rules':
            return await this.rulesManager.loadRules((args as any)?.rule_type || 'all');

          case 'get_diagram_guidelines':
            return await this.flowchartGuide.getGuidelines((args as any).diagram_type, (args as any).context);

          case 'generate_api_flow_diagram':
            return await this.flowchartGuide.generateApiFlowDiagram((args as any).api_path, (args as any).description, (args as any).module_name);

          case 'validate_diagram_specs':
            return await this.rulesManager.validateSpecs((args as any).diagram_description, (args as any).filename);

          case 'get_file_naming_suggestion':
            return await this.fileManager.suggestFileName((args as any).module_name, (args as any).diagram_type, (args as any).version);

          case 'create_versioned_file':
            return await this.fileManager.createVersionedFile((args as any).module_name, (args as any).diagram_type, (args as any).change_description);

          case 'suggest_version_increment':
            return await this.fileManager.suggestVersionIncrement((args as any).module_name, (args as any).diagram_type, (args as any).change_description);

          case 'convert_mermaid_to_drawio':
            return await this.sequenceGuide.convertMermaidToDrawio((args as any).mermaid_syntax, (args as any).diagram_type, (args as any).module_name, (args as any).description);

          case 'convert_mermaid_to_drawio_llm':
            return await this.sequenceGuide.convertMermaidToDrawioLLM((args as any).mermaid_syntax, (args as any).diagram_type, (args as any).module_name, (args as any).description);

          case 'smart_diagram_assistant':
            return await this.smartDiagramAssistant((args as any).user_request, (args as any).context);

          case 'regenerate_diagram_with_version':
            return await this.regenerateDiagramWithVersion((args as any).mermaid_syntax, (args as any).diagram_type, (args as any).module_name, (args as any).change_description, (args as any).previous_version);

          case 'cleanup_temp_files':
            return await this.fileManager.cleanupTempFiles();

          default:
            throw new Error(`Unknown tool: ${name}`);
        }
      } catch (error) {
        return {
          content: [
            {
              type: 'text',
              text: `Error executing ${name}: ${error instanceof Error ? error.message : String(error)}`
            }
          ]
        };
      }
    });
  }

  async run() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
    console.error('Draw.io MCP server running on stdio');
  }
}

const server = new DrawioMCPServer();
server.run().catch(console.error);
